
21.02.2015, 19:59
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Загрузка ajax'ом в определенный div
Доброго времени суток! У меня на странице блоки div формируются посредством php, данные в div вставляются из базы данных.
<?php
$order = mysql_query("SELECT type_rem, name_pc, second_name_pc, telephone_pc, add_pc, type_pc, id_master FROM pc WHERE id_user = ".(int)$_COOKIE['id_user']) or die(mysql_error());
while ($row = mysql_fetch_array($order)) {
$type_rem = $row['type_rem'];
$name_pc = $row['name_pc'];
$second_name_pc = $row['second_name_pc'];
$telephone_pc = $row['telephone_pc'];
$add_pc = $row['add_pc'];
$type_pc = $row['type_pc'];
$id_master = $row['id_master'];
$master = mysql_query("SELECT id_master, name_master, sname_master, age_master, telephone_master, expert_master, ratio_master, html_master FROM master WHERE id_master = '$id_master'") or die(mysql_error());
while ($mast = mysql_fetch_array($master)) {
$id_master = $mast['id_master'];
$name_master = $mast['name_master'];
$sname_master = $mast['sname_master'];
$age_master = $mast['age_master'];
$expert_master = $mast['expert_master'];
$ratio_master = $mast['ratio_master'];
$html_master = $mast['html_master'];
}
$html = "<div class='col-xs-6 col-md-4 proba'>
<p>Пункт 1: $type_rem</p>
<p>Пункт 1: $name_pc</p>
<p>Пункт 1: $second_name_pc</p>
<p>Пункт 1: $telephone_pc</p>
<p>Пункт 1: $add_pc</p>
<p>Пункт 1: $type_pc</p>
<p>Пункт с id: <a href='masters/$html_master.php'>Информация о человеке</a></p>
<div class='pok'></div>
</div>";
echo $html;
}
//echo $html;
?>
По нажатию ссылки должен загружаться определенный файл. Все работает, вот код
<script>
$(document).ready(function(){
function ajaxmaster() {
$('.proba a').click(function(){
var url = $(this).attr('href');
var th = $(this);
$('.pok').load(url);
return false;
});
}
$('.proba a').click(ajaxmaster());
}); // Конец ready
</script>
Все получается, все загружается, но информация загружается во все div'ы, не зависимо от того, на какую ссылку было произведено нажатие.
<script>
$(document).ready(function(){
$('.proba a').click(function(){
var url = $(this).attr('href');
var th = $(this);
$(this).parent().load(url);
return false;
});
}); // Конец ready
</script>
С таким кодом все работает, загружается именно нужная информация в нужный блок, но пропадает сама ссылка.
Прошу прощения, если коряво написал.
|
|

21.02.2015, 20:58
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Во-первых, сперва надо серверную часть менять, а уж потом о клиенте думать. У вас первый запрос содержит параметр как условие выборки второго запроса. Почему вы не делаете выборку одним запросом, а насилуете SQL запросами в цикле?
|
|

21.02.2015, 23:13
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Я понял, попытался сделать выборку сразу из двух таблиц, но у меня ошибка
$order = mysql_query("SELECR * FROM `pc` JOIN `master` ON `pc.id_master` = `master.id_master`") or die(mysql_error());
print_r($order);
Ошибка такая:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECR * FROM `pc` JOIN `master` ON `pc.id_master` = `master.id_master`' at line 1
Понимаю, что где-то в синтаксисе ошибка, но не понимаю какая
|
|

21.02.2015, 23:30
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
$order = mysql_query("SELECR * FROM master m INNER JOIN pc p ON m.id_master = p.id_master") or die(mysql_error());
print_r($order);
Так тоже ошибка
|
|

21.02.2015, 23:32
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
А что не понятного, нет в MySQL SELECR, есть SELECT.
Да и вообще нужно, запрос:
$order = mysql_query("SELECT pc.*, master.*
FROM pc
LEFT JOIN master
USING(id_master)
WHERE id_user = ".(int)$_COOKIE['id_user']."
ORDER BY id_user");
Убран вывод ошибки. Если вы хотите иметь отладку, то уж сразу либо глобально обрабатывайте ошибки, либо определяйте режим отладка/вывод, чтобы при отладке только на локальном сервере выводилось сообщение mysql_error(), а при выводе пользователям что-то нейтральное. Вы не видите в явном ошибки, а пользователю тем более это не нужно, но вот тем кто специально такое анализирует вы просто дарите подарок.
Далее - заходим сюда, внимательно изучаем описание данной функции и размышляем - "то ли я делаю?" Далее изучаем иные функции, которыми можно получить ряд результата запроса.
Но это еще не все. У вас результат первого запроса помещается в html-элементы, причем зачем-то через промежуточные переменные, а вот результат второго запроса только присваивается (постоянно) переменным, но не видно чтобы использовался. А смысл тогда во втором запросе?
Последний раз редактировалось laimas, 21.02.2015 в 23:35.
|
|

22.02.2015, 13:00
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
laimas
Не знаю почему, но ваш пример кода не сработал, утром на свежую голову сел, вот что получилось. Все работает.
<?php
$order = mysql_query("SELECT pc.*, master.*
FROM pc
INNER JOIN master
ON pc.id_master = master.id_master && pc.id_user = ".(int)$_COOKIE['id_user']) or die(mysql_error());
while ($row = mysql_fetch_array($order)) {
$type_rem = $row['type_rem'];
$name_pc = $row['name_pc'];
$second_name_pc = $row['second_name_pc'];
$telephone_pc = $row['telephone_pc'];
$add_pc = $row['add_pc'];
$type_pc = $row['type_pc'];
$id_master = $row['id_master'];
$name_master = $row['name_master'];
$sname_master = $row['sname_master'];
$html_master= $row['html_master'];
$html = "<div class='col-xs-6 col-md-4 proba'>
<p>Пункт 1: $type_rem</p>
<p>Пункт 2: $name_pc</p>
<p>Пункт 3: $second_name_pc</p>
<p>Пункт 4: $telephone_pc</p>
<p>Пункт 5: $add_pc</p>
<p>Пункт 6: $type_pc</p>
<p>Пункт с id: <a href='masters/$html_master.php'>$name_master $sname_master</a></p>
<div class='pok'></div>
</div>";
echo $html;
}
?>
Знаю, что из таблицы мастера нужно выбрать 3 поля, а не все, с этим проблем нет, но остается проблема с ajax'ом, про которую я писал в первом посте.
|
|

22.02.2015, 15:29
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Как об стенку горохом. Три поля, это значит:
"SELECT pc.*, CONCAT(b.name_master, ' ', b.sname_master) name, b.html_master
FROM pc
INNER JOIN master b
Не работал, потому как я не знаю о связях таблиц ваших. А об объединении JOIN к примеру тут почитать, сдается мне, что JOIN вам вообще не нужен и хватит SELECT * FROM pc, master ...
Ошибки. Определяйте:
define('DEBUG', 1);
//и в запросах
or die(DEBUG ? __FILE__ . '/' . __LINE__ . '/' . mysql_error() : 'Извините, абонет не доступен.');
Вы что собираетесь перед выставлением на сервер руками все удалять или все таки желаете "светить ошибки" свои? То что die(), это синоним exit() думаю знаете, и если в рамках асинхронного диалога этот выходе логичен, но не обязательно логично такое поведение во всех случаях.
mysql_fetch_array($order) - упорно не хотим разбираться почему так плохо? Привычка так поступать рано или поздно сыграет с вами злую шутку, например при работе с BLOB. Бывает еще круче - "Скажите пожалуйста, делаю правильно ... mysql_fetch_array() ... ,а у меня Smarty тупит, два раза выводит одно и тоже?" А кто из них тупит?
Объявлять $type_rem = $row['type_rem']; только ради того чтобы <p>Пункт 1: $type_rem</p>, это просто глупо, что нельзя сразу?:
$html = '<div class="col-xs-6 col-md-4 proba">
<p>Пункт 1: ' . $row['type_rem'] . '</p>....'
Ну и последнее - почему $html = в вашем случае, это неверно?
Переписывайте, не дело так "кодить".
Последний раз редактировалось laimas, 22.02.2015 в 15:50.
|
|

22.02.2015, 18:04
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
<?php
define('DEBUG', 1);
$order = mysql_query("SELECT pc.*, master.*
FROM pc
INNER JOIN master
ON pc.id_master = master.id_master && pc.id_user = ".(int)$_COOKIE['id_user']) or die(DEBUG ? __FILE__ . '/' . __LINE__ . '/' . mysql_error() : 'Извините, ошибка');
while ($row = mysql_fetch_assoc($order)) {
$html = "<div class='col-xs-6 col-md-4 proba2'>
<p>Пункт 1: $row[type_rem]</p>
<p>Пункт 2: $row[name_pc]</p>
<p>Пункт 3: $row[second_name_pc]</p>
<p>Пункт 4: $row[telephone_pc]</p>
<p>Пункт 5: $row[add_pc]</p>
<p>Пункт 6: $row[type_pc]</p>
<p>Пункт с id: <a href='masters/$row[html_master].php'>$row[name_master] $row[sname_master]</a></p>
<div class='pok'></div>
</div>";
echo $html;
}
?>
Вот что получилось, правильно ли я понял, что вместо mysql_fetch_array($order) нужно использовать mysql_fetch_assoc($order)?
Ну и последнее - почему $html = в вашем случае, это неверно?
В каком плане неверно?
P.S. Спасибо большое, что тратите свое время и объясняете все понятно и доступно. Я просто 3 день всего php занимаюсь, так что извините, что так много вопросов.
|
|

22.02.2015, 19:31
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
>правильно ли я понял, что вместо mysql_fetch_array($order) нужно использовать mysql_fetch_assoc($order)
А вы читали о функции mysql_fetch_array() по ссылке, что я давал, что она возвращает без указания второго параметра? Она возвращает два идентичных набора, которые различаются типом индексов. Ну хорошо, что мало данных, но ведь и получение лишнего вам не нужного, это напрасная трата времени. А если объем данных большой, в случае BLOB, это еще и впустую забивать память совсем не нужным. Думать то надо об этом.
Заходим на официальный сайт РНР и скачиваем руководство в формате СНМ, и оно должно быть обязательной настольной книгой.
Что касается MySQL, то это расширение начиная с версии РНР 5.5 более поддерживаться не будет, и коли вы всего три дня занимаетесь, то лучше сразу переходите или на mysqli, или PDO.
Почему не верно - в вашем случае тогда уж нужно делать чистый html вывод со вставкой php-переменных, или же подготовить строку для выдачи, а вывод после цикла. Строки заключенные в двойные кавычки РНР подвергает разбору, в одинарные нет. Вывод рядов как объектов:
while ($r = mysql_fetch_object($order))
$html .= '<div class="col-xs-6 col-md-4 proba2">
<p>Пункт 1: '.$r->type_rem.'</p>
<p>Пункт 2: '.$r->name_pc.'</p>
<p>Пункт 3: '.$r->second_name_pc.'</p>
<p>Пункт 4: '.$r->telephone_pc.'</p>
<p>Пункт 5: '.$r->add_pc.'</p>
<p>Пункт 6: '.$r->type_pc.'</p>
<p>Пункт с id: <a href="masters/'.$r->html_master.'.php">'.$r->name.'</a></p>
<div class="pok"></div>
</div>';
echo $html
Фигурные скобки не обязательны. $r->name вместо name_master и sname_master с учетом того, что эти два поля можно объединить в самом запросе:
CONCAT(master.name_master, ' ', master.sname_master) name
под псевдонимом name. Хотя никто не запрещает поступать так как вы делаете. Если вам из второй таблицы нужно только три поля, то не получайте их все - pc.*, master.*, если все нужно, можно было бы указать SELECT * FROM .... Я их примере написал так, потому как видел перечисление полей в запросах ваших, поэтому для master укажите только необходимые поля, а не выбирайте их все.
Метод .load() jQuery - он прост, прочтите по ссылке еще раз о нем.
А после всех правок и ознакомлений .... теперь можете конкретно переходить к ошибкам, то есть к обсуждению "что-то не работает", если такое будет.
Последний раз редактировалось laimas, 22.02.2015 в 21:10.
|
|

22.02.2015, 21:29
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
<?php
define('DEBUG', 1);
$order = mysql_query("SELECT pc.*, master.name_master, master.sname_master, master.html_master
FROM pc
INNER JOIN master
ON pc.id_master = master.id_master && pc.id_user = ".(int)$_COOKIE['id_user']) or die(DEBUG ? __FILE__ . '/' . __LINE__ . '/' . mysql_error() : 'Извините, ошибка');
while ($r = mysql_fetch_object($order)) {
$html .= '<div class="col-xs-6 col-md-4 proba2">
<p>Пункт 1: '.$r->type_rem.'</p>
<p>Пункт 2: '.$r->name_pc.'</p>
<p>Пункт 3: '.$r->second_name_pc.'</p>
<p>Пункт 4: '.$r->telephone_pc.'</p>
<p>Пункт 5: '.$r->add_pc.'</p>
<p>Пункт 6: '.$r->type_pc.'</p>
<p>Пункт с id: <a href="masters/'.$r->html_master.'.php">'.$r -> name_master.' '.$r -> sname_master.'</a></p>
<div class="pok"></div>
</div>';
echo $html;
}
?>
Почему-то выводится 6 записей, вместо 3-х, т.е. идет дублирование.
А как можно написать чистый html, если ко-во div зависит от кол-ва записей в базе? И если формировать строку для выдачи, то как это можно сделать? Хотя бы ссылки, где можно прочитать.
С функцией .load() я разобрался, все работает и загружается. Но не все точно работает.
1) Информация загружается в саму ссылку, оно и понятно, потому что идет выборка $(this).load(url);
2) Либо в тэг <p></p>, но тут тоже понятно, потому что идет такая выборка $(this).parent().load(url);
3) Либо в <div class="pok"></div>, но тогда информация грузится во все div в не зависимости от того, на какую ссылку был произведен клик
4) Хотел сделать так, чтобы он выбрал div
$(this).next().load(url), но он, почему-то, не хотел находить следующий тэг
Вот полный код
<script>
$(document).ready(function(){
$('.proba a').click(function(){
var url = $(this).attr('href');
var th = $(this);
$('.pok').load(url);
return false;
});
}); // Конец ready
</script>
Извините, если коряво описал проблему
|
|
|
|